home *** CD-ROM | disk | FTP | other *** search
/ CD Ware Multimedia 1995 May / cd Ware (Juegos) Epimundo.iso / DOS / PRGMMING / M2PROTOS.ZIP / FIOASM.A < prev    next >
Encoding:
Text File  |  1991-02-09  |  36.4 KB  |  1,796 lines

  1. (* module FioAsm
  2.  
  3.  
  4. File input-output routines for JPI Modula-2, version 2
  5.     by Carl Neiburger
  6.        169 N. 25th St.
  7.        San Jose, Calif. 95116
  8.  
  9.        CompuServe No. 72336,2257
  10.  
  11. These routines are intended to replace low-level routines in JPI's FIO.MOD.
  12. FioAsm's routines are optimized through assembly language.
  13.  
  14. *)
  15.  
  16. sameCS   = 1 - ( (model / 1) & 1 )
  17. sameDS   = 1 - ( (model / 2) & 1 )
  18. LongAddr = ( (model / 4) & 1 ) | ( (model / 2) & 1 )
  19. RegParam = (model / 16) & 1
  20. (*%F sameCS *)
  21.     frame = 4
  22. (*%E *)
  23. (*%T sameCS *)
  24.     frame = 2
  25. (*%E *)
  26. module FioAsm
  27.  
  28. section; segment _TEXT(CODE,28H); segment _BSS(BSS, 28H); 
  29. group DGROUP(_BSS)
  30.  
  31. select _BSS
  32. public FioAsm@path:    org 65
  33. select _TEXT
  34.  
  35. public FioAsm$ToPath:         (* on entry, ds:si are string to copy *)
  36.     push es; push di    (* and cx is length *)
  37.     cmp  cx, 64         (* is string too long? *)
  38.     jb   ToPath1
  39.     mov  cx, 64         (* then truncate *)
  40. ToPath1:
  41.     mov  bx, seg FioAsm@path
  42.     mov  es, bx
  43.     mov  di,FioAsm@path
  44.     xor  al,al          (* search for 0 *)
  45.     repne
  46.     movsb               (* move it *)
  47. (*%T LongAddr *)
  48.     mov  ds, bx
  49. (*%E *)
  50.     mov  dx,FioAsm@path
  51.     mov  byte [di],0    (* add zero *)
  52. ToPath2:
  53.     pop  di; pop es
  54.     ret  near 0
  55.  
  56. section; segment _TEXT(CODE,28H); segment _BSS(BSS, 28H); 
  57. group DGROUP(_BSS)
  58.  
  59. select _TEXT
  60. public FioAsm@IOR:    dw   0
  61.  
  62. public FioAsm$SetIorBool :
  63.     jnc  SetOK
  64.     mov  cs:[FioAsm@IOR],ax
  65.     xor  ax, ax
  66.     ret  near 0
  67. SetOK:
  68.     mov  word cs:[FioAsm@IOR],0
  69.     mov  ax, 1
  70.     ret  near 0
  71.  
  72. public FioAsm$IOresult:
  73.     mov  ax, cs:[FioAsm@IOR]
  74.     mov  word [FioAsm@IOR],0
  75. (*%F sameCS *)
  76.     ret  far 0
  77. (*%E *)
  78. (*%T sameCS *)
  79.     ret near 0
  80. (*%E *)
  81.  
  82. section; segment _TEXT(CODE,28H); segment _BSS(BSS, 28H); group DGROUP(_BSS)
  83. select _TEXT
  84.  
  85. extrn FioAsm@IOR
  86. extrn FioAsm$ToPath
  87.  
  88. public FioAsm$Create : 
  89. (*%T RegParam *)
  90.          RetSize = 0 (* AX = Len; BX = Ofs = 8; CX = Seg *)
  91. (*%E *)
  92. (*%F RegParam *)
  93.   (*%T LongAddr *)
  94.          RetSize = 6
  95.          NameLen = frame+6; NameSeg = frame+4; NameOfs = frame+2;
  96.   (*%E *)
  97.   (*%F LongAddr *)
  98.          RetSize = 4
  99.          NameLen = frame+4; NameOfs = frame+2;
  100.   (*%E *)
  101.     push bp; mov bp,sp
  102. (*%E *) (* F RegParam *)
  103.     push si
  104.     push dx
  105. (*%T LongAddr *)
  106.     push ds
  107.   (*%T RegParam *)
  108.     mov  ds, cx
  109.   (*%E *)
  110.   (*%F RegParam *)
  111.     lds  si, [bp][NameOfs]
  112.   (*%E *)
  113. (*%E *)
  114. (*%F RegParam *)
  115.   (*%F LongAddr *)
  116.     mov  si, [bp][NameOfs]
  117.   (*%E *)
  118.     mov  cx, [bp][NameLen]
  119. (*%E *)
  120. (*%T RegParam *)
  121.     mov  si, bx
  122.     mov  cx, ax
  123. (*%E *)
  124.     call near FioAsm$ToPath
  125.     mov  ah, 3CH             (* create file *)
  126.     xor  cx, cx              (* no attribute *)
  127.     int  21H
  128.     jnc  CrRet                (* handle is in ax *)
  129.     mov  cs:[FioAsm@IOR],ax         (* error is in ax *)
  130.     xor  ax,ax
  131.     not  ax                  (* return MAX(CARDINAL) *)
  132. CrRet:
  133. (*%T LongAddr *)
  134.     pop ds
  135. (*%E *)
  136.     pop  dx
  137.     pop si
  138. (*%F RegParam *)
  139.     pop bp; 
  140. (*%E *)
  141. (*%F sameCS *)
  142.     ret  far RetSize
  143. (*%E *)
  144. (*%T sameCS *)
  145.     ret near RetSize
  146. (*%E *)
  147.  
  148. section; segment _TEXT(CODE,28H); segment _BSS(BSS, 28H); group DGROUP(_BSS)
  149. select _TEXT
  150.  
  151. extrn FioAsm@IOR
  152. extrn FioAsm$ToPath
  153.  
  154. public FioAsm$Open : (* AX=Len; BX=Ofs; CX=Seg; CX/DX=Type *)
  155. (*%T RegParam *)
  156.          RetSize = 0 (* AX=Len; BX=Ofs; CX=Seg; CX/DX=Type *)
  157. (*%E *)
  158. (*%F RegParam *)
  159.  (*%T LongAddr *)
  160.          RetSize = 8; 
  161.          NameLen = frame+8; NameSeg = frame+6; 
  162.          NameOfs = frame+4; Type = frame+2;
  163.  (*%E *)
  164.  (*%F LongAddr *)
  165.          RetSize = 6; 
  166.          NameLen = frame+6;
  167.          NameOfs = frame+4; Type = frame+2;
  168.  (*%E *)
  169.     push bp; mov bp,sp
  170. (*%E *)
  171.     push si
  172.     push dx
  173. (*%T RegParam *)
  174.  (*%T LongAddr *)
  175.     push ds
  176.     mov  ds, cx
  177.     push dx                  (* save type *)
  178.  (*%E *)
  179.  (*%F LongAddr *)
  180.     push cx                  (* save type *)
  181.  (*%E *)
  182.     mov  si, bx
  183.     mov  cx, ax
  184. (*%E *) (* RegParam *)
  185. (*%F RegParam *)
  186.  (*%T LongAddr *)
  187.     push ds
  188.     lds  si, [bp][NameOfs]
  189.  (*%E *)
  190.  (*%F LongAddr *)
  191.     mov  si, [bp][NameOfs]
  192.  (*%E *)
  193.     mov  cx, [bp][NameLen]
  194. (*%E *) (* F RegParam *)
  195.     call near FioAsm$ToPath
  196. (*%T RegParam *)
  197.     pop  ax                  (* put type in AL *)
  198. (*%E *) (* RegParam *)
  199. (*%F RegParam *)
  200.     mov  al, [bp][Type]
  201. (*%E *) (* F RegParam *)
  202.     mov  ah, 3DH             (* open file *)
  203.     int  21H
  204.     jnc   Ret              (* handle is in ax *)
  205.     mov  cs:[FioAsm@IOR],ax         (* error is in ax *)
  206.     xor  ax,ax
  207.     not  ax                  (* return MAX(CARDINAL) *)
  208. Ret:
  209. (*%T LongAddr *)
  210.     pop ds
  211. (*%E *)
  212.     pop  dx
  213.     pop  si
  214. (*%F RegParam *)
  215.     pop bp; 
  216. (*%E *)
  217. (*%F sameCS *)
  218.     ret  far RetSize 
  219. (*%E *)
  220. (*%T sameCS *)
  221.     ret near RetSize 
  222. (*%E *)
  223.  
  224. section; segment _TEXT(CODE,28H); segment _BSS(BSS, 28H); group DGROUP(_BSS)
  225. select _TEXT
  226.  
  227. extrn FioAsm$SetIorBool 
  228.  
  229. public FioAsm$Close : 
  230. (*%F RegParam *)
  231.     handle = frame+2;    RetSize = 2
  232.     push bp; mov bp,sp
  233.     mov  bx, [bp][handle]
  234. (*%E *)
  235.     push dx
  236. (*%T RegParam *)
  237.     RetSize = 0
  238.     mov  bx, ax              (* AX = handle *)
  239. (*%E *)
  240.     mov  ah, 3EH             (* close file *)
  241.     int  21H
  242.     call near FioAsm$SetIorBool 
  243.     pop  dx
  244. (*%F RegParam *)
  245.     pop bp
  246. (*%E *)       (* F RegParam *)
  247. (*%F sameCS *)
  248.     ret  far RetSize
  249. (*%E *)
  250. (*%T sameCS *)
  251.     ret near RetSize
  252. (*%E *)
  253.  
  254. section; segment _TEXT(CODE,28H); select _TEXT
  255.  
  256. extrn FioAsm$SetIorBool 
  257.  
  258. public FioAsm$Truncate :
  259. (*%F RegParam *)
  260.     handle = frame+2;    RetSize = 2
  261.     push bp; mov bp,sp
  262.     mov  bx, [bp][handle]
  263. (*%E *)
  264. (*%T RegParam *)
  265.     RetSize = 0
  266.     mov  bx, ax              (* AX = handle *)
  267. (*%E *)
  268.     push dx
  269.     mov  ah, 40H             (* write *)
  270.     xor  cx, cx
  271.     int  21H
  272.     call near FioAsm$SetIorBool 
  273.     pop  dx
  274. (*%F RegParam *)
  275.     pop bp
  276. (*%E *)       (* F RegParam *)
  277. (*%F sameCS *)
  278.     ret  far RetSize
  279. (*%E *)
  280. (*%T sameCS *)
  281.     ret near RetSize
  282. (*%E *)
  283.  
  284. section; segment _TEXT(CODE,28H); segment _BSS(BSS, 28H); group DGROUP(_BSS)
  285. select _TEXT
  286.  
  287. extrn FioAsm@IOR
  288.  
  289. public FioAsm$Read :
  290. (*%F RegParam *)
  291.     push bp; mov bp,sp
  292.     push dx
  293.  (*%T LongAddr *)
  294.     handle = frame+10; BufLen = frame+8;
  295.     BufSeg = frame+6; BufOfs = frame+4; Count = frame+2;
  296.     RetSize = 10
  297.     push ds;
  298.     lds  dx, [bp][BufOfs]
  299.  (*%E *)
  300.  (*%F LongAddr *)
  301.     handle = frame+8; BufLen = frame+6;
  302.     BufOfs = frame+4; Count = frame+2;
  303.     RetSize = 8
  304.     mov  dx, [bp][BufOfs]
  305.  (*%E *)
  306.     mov  cx, [bp][Count]
  307.     mov  bx, [bp][handle]
  308. (*%E *)
  309. (*%T RegParam *) (*AX=handle; BX=Len; CX=Ofs; DX=Seg; DX/f+6=count*)
  310.   (*%T LongAddr *)
  311.     RetSize = 2              (* calling procedure pops *)
  312.     Count = frame + 2;
  313.     push bp; mov bp,sp
  314.     push dx
  315.     push ds;
  316.     mov  ds, dx              (* DX = offset *)
  317.     mov  dx, cx              (* make DX offset *)
  318.     mov  cx, [bp][Count]
  319.   (*%E *)
  320.   (*%F LongAddr *)
  321.     RetSize = 0              (* calling procedure pops *)
  322.     push dx
  323.     xchg cx, dx              (* make DX offset, CX count *)
  324.   (*%E *)
  325.     mov  bx, ax
  326. (*%E *)
  327.     mov  ah, 3FH             (* read file *)
  328.     int  21H
  329.     jnc  ReRet               (* bytes read are ax *)
  330.     mov  cs:[FioAsm@IOR],ax         (* error is in ax *)
  331.     xor  ax,ax               (* if error, return zero *)
  332. ReRet:
  333. (*%T LongAddr *)
  334.     pop ds
  335. (*%E *)
  336.     pop  dx
  337. (*%T RegParam *)
  338.   (*%T LongAddr *)
  339.     pop bp
  340.   (*%E *)
  341. (*%E *)
  342. (*%F RegParam *)
  343.     pop bp
  344. (*%E *)
  345. (*%F sameCS *)
  346.     ret  far RetSize
  347. (*%E *)
  348. (*%T sameCS *)
  349.     ret near RetSize
  350. (*%E *)
  351.  
  352. section; segment _TEXT(CODE,28H); segment _BSS(BSS, 28H); group DGROUP(_BSS)
  353. select _TEXT
  354.  
  355. extrn FioAsm@IOR
  356.  
  357. public FioAsm$Write :
  358. (*%T RegParam *)(* AX= handle; BX=Len; CX=Ofs; DX=Seg; DX/f+2= Count*)
  359.   (*%T LongAddr *)
  360.     RetSize = 2              (* calling procedure pops *)
  361.     Count = frame+2
  362.     push bp; mov bp,sp
  363.   (*%E *)
  364.   (*%F LongAddr *)
  365.     RetSize = 0              (* calling procedure pops *)
  366.   (*%E *)
  367. (*%E *)
  368. (*%F RegParam *)
  369.   (*%T LongAddr *)
  370.     RetSize = 10; handle = frame+10; BufLen = frame+8;
  371.     BufSeg = frame+6; BufOfs = frame+4; Count = frame+2;
  372.   (*%E *)
  373.   (*%F LongAddr *)
  374.     RetSize = 8; handle = frame+8; BufLen = frame+6;
  375.     BufOfs = frame+4; Count = frame+2;
  376.   (*%E *)
  377.     push bp; mov bp,sp
  378. (*%E *)
  379.     push dx
  380. (*%T LongAddr *)
  381.     push ds
  382.   (*%T RegParam *)
  383.     mov  ds, dx              (* segment *)
  384.     mov  dx, cx              (* offset *)
  385.   (*%E *)
  386.   (*%F RegParam *)
  387.     lds  dx, [bp][BufOfs]
  388.   (*%E *)
  389.     mov  cx, [bp][Count]
  390. (*%E *)
  391. (*%F LongAddr *)
  392.   (*%T RegParam *)
  393.     xchg cx, dx              (* make DX offset, CX count *)
  394.   (*%E *)
  395.   (*%F RegParam *)
  396.     mov dx, [bp][BufOfs]
  397.     mov cx, [bp][Count]
  398.   (*%E *)
  399. (*%E *)
  400. (*%T RegParam *)
  401.     mov  bx, ax              (* handle *)
  402. (*%E *)
  403. (*%F RegParam *)
  404.     mov  bx, [bp][handle]
  405. (*%E *)
  406.     mov  ah, 40H             (* write file *)
  407.     int  21H
  408.     jnc  WrRet               (* bytes written are in ax *)
  409.     mov  cs:[FioAsm@IOR],ax        (* error is in ax *)
  410.     xor  ax,ax               (* if error, return zero *)
  411. WrRet:
  412. (*%T LongAddr *)
  413.     pop ds
  414. (*%E *)
  415.     pop  dx
  416. (*%T RegParam *)
  417.   (*%T LongAddr *)
  418.     pop bp
  419.   (*%E *)
  420. (*%E *)
  421. (*%F RegParam *)
  422.     pop bp
  423. (*%E *)
  424. (*%F sameCS *)
  425.     ret  far RetSize
  426. (*%E *)
  427. (*%T sameCS *)
  428.     ret near RetSize
  429. (*%E *)
  430.  
  431. section; segment _TEXT(CODE,28H); select _TEXT
  432.  
  433. extrn FioAsm$SetIorBool 
  434. extrn FioAsm$ToPath
  435.  
  436. public FioAsm$Rename : 
  437.     RegsToPop = 6; SaveOldLen = -8
  438. (*%T RegParam *) (*AX=OldLen; BX=OldOfs *)
  439.   (*%T LongAddr *)       (* CX=OldSeg; DX=NewLen *)
  440.     RetSize = 4
  441.     NewSeg=frame+4; NewOfs=frame+2; 
  442.   (*%E *)
  443.   (*%F LongAddr *)(* CX=NewLen DX=NewOfs *)
  444.     RetSize = 0
  445.   (*%E *)
  446. (*%E *)
  447. (*%F RegParam *)
  448.   (*%T LongAddr *)
  449.     OldLen = frame+12; OldSeg = frame+10; OldOfs = frame+8; 
  450.     NewLen = frame+6;  NewSeg = frame+4;  NewOfs = frame+2; 
  451.     RetSize = 12
  452.   (*%E *)
  453.   (*%F LongAddr *)
  454.     OldLen = frame+8; OldOfs = frame+6; 
  455.     NewLen = frame+4;  NewOfs = frame+2;  RetSize = 8
  456.   (*%E *)
  457. (*%E *)
  458.     push bp; mov bp,sp
  459.     push si; push di; 
  460. (*%F LongAddr *)
  461.     push dx
  462. (*%E *)
  463. (*%T LongAddr *)
  464.     push ds; 
  465.     lds  si,[bp][NewOfs]
  466.   (*%T RegParam *)
  467.     xchg  cx,dx              (* CX= NewLen; DX = OldSeg *)
  468.   (*%E *)
  469. (*%E *)
  470. (*%F RegParam *)
  471.     mov  cx,[bp][NewLen]
  472. (*%E *)
  473. (*%F LongAddr *)
  474.   (*%T RegParam *)
  475.     mov  si, dx              (* NewOfs; CX already = NewLen *)
  476.   (*%E *)
  477.   (*%F RegParam *)
  478.     mov  si, [bp][NewOfs]
  479.   (*%E *)
  480. (*%E *)
  481. (*%T RegParam *)
  482.     push ax                  (* save OldLen *)
  483. (*%E *)
  484.     xor  ax, ax
  485.     push ax                  (* zero to terminate string *)
  486.     sub  sp,cx               (* make room for string *)
  487.     mov  di, ss
  488.     mov  es, di
  489.     mov  di,sp
  490.     rep
  491.     movsb                    (* move it *)
  492.     mov  di,sp               (* point back to string start *)
  493. (*%T RegParam *)
  494.   (*%T LongAddr *)
  495.     mov  ds, dx              (* OldSeg *)
  496.   (*%E *)
  497.     mov  si, bx              (* OldOfs *)
  498.     mov  cx, [bp][SaveOldLen](* OldLen *)
  499. (*%E *)
  500. (*%F RegParam *)
  501.   (*%T LongAddr *)
  502.     lds  si, [bp][OldOfs]
  503.   (*%E *)
  504.   (*%F LongAddr *)
  505.     mov  si, [bp][OldOfs]
  506.   (*%E *)
  507.     mov  cx, [bp][OldLen]
  508. (*%E *)
  509.     call near FioAsm$ToPath  (* point ds:dx to old name *)
  510.     mov  ah, 56H             (* rename *)
  511.     int  21H
  512.     call near FioAsm$SetIorBool 
  513.     mov  sp, bp              (* restore stack pointer *)
  514.     sub  sp, RegsToPop       (* except for following 3 or 4 words *)
  515. (*%T LongAddr *)
  516.     pop  ds
  517. (*%E *)
  518. (*%F LongAddr *)
  519.     pop  dx
  520. (*%E *)
  521.     pop di; pop si
  522.     pop bp; 
  523. (*%F sameCS *)
  524.     ret  far RetSize
  525. (*%E *)
  526. (*%T sameCS *)
  527.     ret near RetSize
  528. (*%E *)
  529.  
  530. section; segment _TEXT(CODE,28H); select _TEXT
  531. (* NO ARGUMENTS *)
  532. public FioAsm$GetDrive:
  533.     mov  ah, 19H   (* get drive *)
  534.     int  21H
  535.     inc  al        (* bump A up to 1, etc *)
  536. (*%F sameCS *)
  537.     ret  far 0
  538. (*%E *)
  539. (*%T sameCS *)
  540.     ret near 0
  541. (*%E *)
  542.  
  543. section; segment _TEXT(CODE,28H); select _TEXT
  544.  
  545. extrn FioAsm$GetDrive
  546.  
  547. (* NO ARGUMENTS *)
  548. public FioAsm$Drives:
  549.     push dx
  550. (*%F sameCS *)
  551.     call far FioAsm$GetDrive
  552. (*%E *)
  553. (*%T sameCS *)
  554.     call near FioAsm$GetDrive
  555. (*%E *)
  556.     dec  al        (* A = 0 in this case *)
  557.     mov  dl, al
  558.     mov  ah, 0EH   (* number of drives *)
  559.     int  21H
  560.     pop  dx
  561. (*%F sameCS *)
  562.     ret  far 0
  563. (*%E *)
  564. (*%T sameCS *)
  565.     ret near 0
  566. (*%E *)
  567.  
  568. section; segment _TEXT(CODE,28H); select _TEXT
  569.  
  570. extrn FioAsm$Drives
  571. extrn FioAsm$SetIorBool 
  572.  
  573. public FioAsm$SetDrive: 
  574. (*%F RegParam *)
  575.     drive = frame+2; RetSize = 2
  576.     push bp; mov bp,sp
  577.     push dx
  578. (*%E *)
  579. (*%T RegParam *) (* AX = drive *)
  580.     RetSize = 0
  581.     push dx
  582.     push ax                       (* save drive *)
  583. (*%E *)
  584. (*%F sameCS *)
  585.     call far FioAsm$Drives        (* how many are there? *)
  586. (*%E *)
  587. (*%T sameCS *)
  588.     call near FioAsm$Drives       (* how many are there? *)
  589. (*%E *)
  590. (*%T RegParam *)
  591.     pop  dx                       (* retrieve drive *)
  592. (*%E *)
  593. (*%F RegParam *)
  594.     mov  dl, [bp][drive]
  595. (*%E *)
  596.     cmp  al,dl                    (* does requested drive exist? *)
  597.     jl   SDerr                    (* if so, forget it *)
  598.     mov  ah, 0EH   (* set drive *)
  599.     dec  dl
  600.     int  21H
  601.     clc
  602.     jmp  SDret
  603. SDerr:
  604.     mov  ax,15
  605.     stc
  606. SDret:
  607.     call near FioAsm$SetIorBool 
  608.     pop  dx
  609. (*%F RegParam *)
  610.     pop bp
  611. (*%E *)
  612. (*%F sameCS *)
  613.     ret  far RetSize
  614. (*%E *)
  615. (*%T sameCS *)
  616.     ret near RetSize
  617. (*%E *)
  618.  
  619. section; segment _TEXT(CODE,28H); select _TEXT
  620.  
  621. public FioAsm$SetVerify: 
  622. (*%T RegParam *) (* AL = SVon *)
  623.     RetSize = 0
  624. (*%E *)
  625. (*%F RegParam *)
  626.     RetSize = 2
  627.     SVon = frame+2
  628.     push bp; mov bp,sp
  629.     mov  al, [bp][SVon]
  630. (*%E *)
  631.     push dx
  632.     xor  dl, dl
  633.     mov  ah, 2EH
  634.     int  21H
  635.     pop  dx
  636. (*%F RegParam *)
  637.     pop bp
  638. (*%E *)
  639. (*%F sameCS *)
  640.     ret  far RetSize
  641. (*%E *)
  642. (*%T sameCS *)
  643.     ret near RetSize
  644. (*%E *)
  645.  
  646. section; segment _TEXT(CODE,28H); select _TEXT
  647.  
  648. (* NO ARGUMENTS *)
  649. public FioAsm$VerifyIsOn:
  650.     mov  ah, 54H   (* number of drives *)
  651.     int  21H
  652. (*%F sameCS *)
  653.     ret  far 0
  654. (*%E *)
  655. (*%T sameCS *)
  656.     ret near 0
  657. (*%E *)
  658.  
  659. section; segment _TEXT(CODE,28H); select _TEXT
  660.  
  661. extrn FioAsm$SetIorBool 
  662. extrn FioAsm$ToPath
  663.  
  664. public FioAsm$SetFileAttribute : 
  665. (*%F RegParam *)
  666.   (*%T LongAddr *)
  667.     Attr = frame+8; FNLen = frame+6; FNSeg = frame+4; FNOfs = frame+2;
  668.     RetSize = 8
  669.   (*%E *)
  670.   (*%F LongAddr *)
  671.     Attr = frame+6; FNLen = frame+4; FNOfs = frame+2;
  672.     RetSize = 6
  673.   (*%E *)
  674.     push bp; mov bp,sp
  675. (*%E *)
  676. (*%T RegParam *) (* AX=Attr; BX=Len; CX=Ofs; DX=Seg *)
  677.     RetSize = 0
  678. (*%E *)
  679.     push si
  680.     push dx
  681. (*%T LongAddr *)
  682.     push ds
  683.   (*%T RegParam *)
  684.     mov  ds, dx
  685.   (*%E *)
  686.   (*%F RegParam *)
  687.     lds  si, [bp][FNOfs]
  688.   (*%E *)
  689. (*%E *)
  690. (*%F LongAddr *)
  691.   (*%F RegParam *)
  692.      mov  si, [bp][FNOfs]
  693.   (*%E *)
  694. (*%E *)
  695. (*%T RegParam *)
  696.     mov  si, cx
  697.     mov  cx, bx
  698.     push ax             (* Save Attr *)
  699. (*%E *)
  700. (*%F RegParam *)
  701.     mov  cx, [bp][FNLen]
  702. (*%E *)
  703.     call near FioAsm$ToPath
  704. (*%T RegParam *)
  705.     pop  cx
  706. (*%E *)
  707. (*%F RegParam *)
  708.     mov  cx, [bp][Attr]
  709. (*%E *)
  710.     mov  ax, 4301H
  711.     int  21H
  712.     call near FioAsm$SetIorBool 
  713. (*%T LongAddr *)
  714.     pop ds
  715. (*%E *)
  716.     pop  dx
  717.     pop  si
  718. (*%F RegParam *)
  719.     pop bp
  720. (*%E *)
  721. (*%F sameCS *)
  722.     ret  far RetSize
  723. (*%E *)
  724. (*%T sameCS *)
  725.     ret near RetSize
  726. (*%E *)
  727.  
  728. section; segment _TEXT(CODE,28H); segment _BSS(BSS, 28H); group DGROUP(_BSS)
  729. select _TEXT
  730.  
  731. extrn FioAsm@IOR
  732. extrn FioAsm$ToPath
  733.  
  734. public FioAsm$GetFileAttribute : (* AX=Len; BX=Ofs; CX=Seg *)
  735. (*%T RegParam *)
  736.     RetSize = 0
  737. (*%E *)
  738. (*%F RegParam *)
  739.   (*%T LongAddr *)
  740.     FNLen = frame+6; FNSeg =  frame+4; FNOfs = frame+2; RetSize = 6
  741.   (*%E *)
  742.   (*%F LongAddr *)
  743.     FNLen = frame+4; FNOfs = frame+2; RetSize = 4
  744.   (*%E *)
  745.     push bp; mov bp,sp
  746. (*%E *)
  747.     push si
  748.     push dx
  749.     push cx
  750. (*%T LongAddr *)
  751.     push ds
  752.   (*%F RegParam *)
  753.     lds  si, [bp][FNOfs]
  754.   (*%E *)
  755.   (*%T RegParam *)
  756.     mov  ds, cx
  757.   (*%E *)
  758. (*%E *)
  759. (*%F RegParam *)
  760.   (*%F LongAddr *)
  761.     mov  si, [bp][FNOfs]
  762.   (*%E *)
  763.     mov  cx, [bp][FNLen]
  764. (*%E *)
  765. (*%T RegParam *)
  766.     mov  si, bx
  767.     mov  cx, ax
  768. (*%E *)
  769.     call near FioAsm$ToPath
  770.     mov  ax, 4300H
  771.     int  21H
  772.     jnc  GAtOK
  773.     mov  cs:[FioAsm@IOR],ax         (* error is in ax *)
  774.     mov  ax, 40H              (* attribute = ioerror *)
  775.     jmp  GAtRet
  776. GAtOK:
  777.     mov ax, cx                (* return attributes *)
  778. GAtRet:
  779. (*%T LongAddr *)
  780.     pop ds
  781. (*%E *)
  782.     pop cx
  783.     pop dx
  784.     pop si
  785. (*%F RegParam *)
  786.     pop bp
  787. (*%E *)
  788. (*%F sameCS *)
  789.     ret  far RetSize
  790. (*%E *)
  791. (*%T sameCS *)
  792.     ret near RetSize
  793. (*%E *)
  794.  
  795. section; segment _TEXT(CODE,28H); segment _BSS(BSS, 28H); group DGROUP(_BSS)
  796. select _TEXT
  797.  
  798. extrn FioAsm@IOR
  799.  
  800. public FioAsm$FileTime : 
  801. (*%F RegParam *)
  802.     Fi = frame+2; 
  803.     RetSize = 2
  804.     push bp; mov bp,sp
  805.     mov  bx, [bp][Fi]
  806. (*%E *)
  807. (*%T RegParam *)
  808.     (* AX= handle*)
  809.     RetSize = 0
  810.     mov  bx, ax
  811. (*%E *)
  812.     mov  ax, 5700H
  813.     int  21H
  814.     jnc  TimeOK
  815.     xor  ax, ax  (* we goofed; no time *)
  816.     xor  dx, dx
  817.     mov  cs:[FioAsm@IOR],ax         (* error is in ax *)
  818.     jmp  TimeRet
  819. TimeOK:
  820.     mov  ax, cx   (* return low byte in ax; high is in dx already *)
  821. TimeRet:
  822. (*%F RegParam *)
  823.     pop  bp
  824. (*%E *)
  825. (*%F sameCS *)
  826.     ret  far RetSize
  827. (*%E *)
  828. (*%T sameCS *)
  829.     ret near RetSize
  830. (*%E *)
  831.  
  832. section; segment _TEXT(CODE,28H); select _TEXT
  833.  
  834. extrn FioAsm$SetIorBool 
  835.  
  836. public FioAsm$SetFileTime : 
  837. (*%F RegParam *)
  838.     Fi = frame+6; HiTime = frame+4; LoTime = frame+2; 
  839.     RetSize = 6
  840.     push bp; mov bp,sp
  841.     push dx
  842.     mov  bx, [bp][Fi]
  843.     mov  cx, [bp][LoTime]
  844.     mov  dx, [bp][HiTime]
  845. (*%E *)
  846. (*%T RegParam *)
  847.     (*AX=handle; BX=LoTime; CX=HiTime*)
  848.     RetSize = 0
  849.     push dx
  850.     mov  dx, cx              (* HiTime *)
  851.     mov  cx, bx              (* LoTime *)
  852.     mov  bx, ax              (* handle *)
  853. (*%E *)
  854.     mov  ax, 5701H
  855.     int  21H
  856.     call near FioAsm$SetIorBool 
  857.     pop  dx
  858. (*%F RegParam *)
  859.     pop  bp
  860. (*%E *)
  861. (*%F sameCS *)
  862.     ret  far RetSize
  863. (*%E *)
  864. (*%T sameCS *)
  865.     ret near RetSize
  866. (*%E *)
  867.  
  868. section; segment _TEXT(CODE,28H); select _TEXT
  869.  
  870. public FioAsm$DecodeFileTime : 
  871.     DYear = 0; DMonth = 2; DDay = 4; DHours = 6; DMins = 8; DSecs = 10;
  872. (*%F RegParam *)
  873.   (*%T LongAddr *)
  874.     PackedDate = frame+8; PackedTime = frame+6; 
  875.     DTSeg = frame+4; DTOfs = frame+2;
  876.     RetSize = 8
  877.   (*%E *)
  878.   (*%F LongAddr *)
  879.     PackedDate = frame+6; PackedTime = frame+4; DTOfs = frame+2;
  880.   (*%E *)
  881.     RetSize = 6
  882.     push bp; mov bp,sp
  883. (*%E *)
  884. (*%T RegParam *)
  885.     (* AX=PackedDate; BX=PackedTime CX = DTOfs; DX = DTSeg *)
  886.     RetSize = 0
  887.     xchg ax, bx
  888. (*%E *)
  889.     push di
  890.     push dx
  891. (*%T LongAddr *)
  892.     push ds
  893.   (*%T RegParam *)
  894.     mov  ds, dx
  895.   (*%E *)
  896.   (*%F RegParam *)
  897.     lds  di, [bp][DTOfs]
  898.   (*%E *)
  899. (*%E *)
  900. (*%F LongAddr *)
  901.   (*%F RegParam *)
  902.     mov  di, [bp][DTOfs]
  903.   (*%E *)
  904. (*%E *)
  905. (*%T RegParam *)
  906.     mov  di, cx         
  907. (*%E *)
  908. (*%F RegParam *)
  909.     mov  ax, [bp][PackedDate]
  910. (*%E *)
  911.     mov  dx, ax             (* save AX = packed date *)
  912.     and  ax, 1FH
  913.     mov  [di][DDay], ax
  914.     mov  ax, dx              (* retrieve packed date *)
  915.     mov  cx, 5
  916.     shr  ax, cx
  917.     mov  dx, ax             (* save AX *)
  918.     and  ax, 0FH
  919.     mov  [di][DMonth], ax
  920.     mov  ax, dx              (* retrieve *)
  921.     mov  cx, 4
  922.     shr  ax, cx
  923.     add  ax, 1980
  924.     mov  [di][DYear], ax
  925. (*%T RegParam *)
  926.     mov  ax, bx         (* packed time *)
  927. (*%E *)
  928. (*%F RegParam *)
  929.     mov  ax, [bp][PackedTime]
  930.     mov  bx, ax         (* save packed time *)
  931. (*%E *)
  932.     and  ax, 1FH
  933.     shl  ax, 1
  934.     mov  [di][DSecs], ax
  935.     mov  ax, bx         (* packed time *)
  936.     mov  cx, 5
  937.     shr  ax, cx
  938.     mov  bx, ax
  939.     and  ax, 3FH
  940.     mov  [di][DMins], ax
  941.     mov  ax, bx
  942.     mov  cx, 6
  943.     shr  ax, cx
  944.     mov  [di][DHours], ax
  945. (*%T LongAddr *)
  946.     pop ds
  947. (*%E *)
  948.     pop  dx
  949.     pop  di
  950. (*%F RegParam *)
  951.     pop  bp
  952. (*%E *)
  953. (*%F sameCS *)
  954.     ret  far RetSize
  955. (*%E *)
  956. (*%T sameCS *)
  957.     ret near RetSize
  958. (*%E *)
  959.  
  960. section; segment _TEXT(CODE,28H); select _TEXT
  961.  
  962. public FioAsm$EncodeFileTime : 
  963.          Year = frame+2; Month = frame+4; Day = frame+6; 
  964.          Hours = frame+8; Mins = frame+10; Secs = frame+12
  965.     push bp; mov bp,sp
  966.     mov  ax, [bp][Year]
  967.     sub  ax, 1980
  968.     mov  cx, 4
  969.     shl  ax, cx
  970.     add  al, [bp][Month]
  971.     mov  cx, 5
  972.     shl  ax, cx
  973.     add  al, [bp][Day]
  974.     mov  dx, ax
  975.     mov  ax, [bp][Hours]
  976.     mov  cx, 6
  977.     shl  ax, cx
  978.     add  al, [bp][Mins]
  979.     mov  cx, 5
  980.     shl  ax, cx
  981.     mov  bx, ax
  982.     mov  ax, [bp][Secs]
  983.     shr  ax, 1
  984.     add  ax, bx
  985.     pop bp
  986. (*%F sameCS *)
  987.     ret  far 12
  988. (*%E *)
  989. (*%T sameCS *)
  990.     ret near 12
  991. (*%E *)
  992.  
  993. section; segment _TEXT(CODE,28H); select _TEXT
  994.  
  995. public FioAsm$GetDir : 
  996. (*%F RegParam *)
  997.   (*%T LongAddr *)
  998.     GDrive = frame+8; GDLen = frame+6; GDSeg =  frame+4; GDOfs = frame+2; 
  999.     RetSize = 8
  1000.   (*%E *)
  1001.   (*%F LongAddr *)
  1002.     GDrive = frame+6; GDLen = frame+4; GDOfs = frame+2; 
  1003.     RetSize = 6
  1004.   (*%E *)
  1005.     push bp; mov bp,sp
  1006. (*%E *)
  1007. (*%T RegParam *)
  1008.     (* AX=Drive; BX=Len; DX=Seg; CX=Ofs *)
  1009.     RetSize = 0
  1010. (*%E *)
  1011.     push si
  1012.     push dx
  1013. (*%T LongAddr *)
  1014.     push ds
  1015.   (*%T RegParam *)
  1016.     mov  ds, dx
  1017.   (*%E *)
  1018.   (*%F RegParam *)
  1019.     lds  si, [bp][GDOfs]
  1020.   (*%E *)
  1021. (*%E *)
  1022. (*%F RegParam *)
  1023.   (*%F LongAddr *)
  1024.     mov  si, [bp][GDOfs]
  1025.   (*%E *)
  1026.     mov  dl, [bp][GDrive]
  1027. (*%E *)
  1028. (*%T RegParam *)
  1029.     mov  si, cx
  1030.     mov  dl, ax
  1031. (*%E *)
  1032.     mov  ah, 47H             (* getdir *)
  1033.     int  21H
  1034.     jnc  GDRet
  1035.     mov  byte [si], 0        (* set string = 0C *)
  1036. GDRet:
  1037. (*%T LongAddr *)
  1038.     pop ds
  1039. (*%E *)
  1040.     pop dx
  1041.     pop si 
  1042. (*%F RegParam *)
  1043.     pop  bp
  1044. (*%E *)
  1045. (*%F sameCS *)
  1046.     ret  far RetSize
  1047. (*%E *)
  1048. (*%T sameCS *)
  1049.     ret near RetSize
  1050. (*%E *)
  1051.  
  1052. section; segment _TEXT(CODE,28H); select _TEXT
  1053.  
  1054. extrn FioAsm$SetIorBool 
  1055. extrn FioAsm$ToPath
  1056.  
  1057. public FioAsm$Erase :
  1058.     mov  ah, 41H   (* erase file; length in AL *)
  1059.     jmp  Act
  1060.  
  1061. public FioAsm$RmDir :
  1062.     mov  ah, 3AH   (* rmDir; length in AL *)
  1063.     jmp  Act
  1064.  
  1065. public FioAsm$MkDir :
  1066.     mov  ah, 39H   (* mkDir; length in AL *)
  1067.     jmp  Act
  1068.  
  1069. public FioAsm$ChDir :
  1070.     mov  ah, 3BH   (* chDir; length in AL *)
  1071.  
  1072. Act:   (* AX= Len; CX=Seg; BX=Ofs *)
  1073. (*%F RegParam *)
  1074.   (*%T LongAddr *)
  1075.     ActLen = frame+6; ActNamSeg = frame+4; ActNamOfs = frame+2;
  1076.     RetSize = 6
  1077.   (*%E *)
  1078.   (*%F LongAddr *)
  1079.     ActLen = frame+4; ActNamOfs = frame+2;
  1080.     RetSize = 4
  1081.   (*%E *)
  1082.     push bp; mov bp,sp
  1083. (*%E *)       (* RegParam *)
  1084.     push si
  1085.     push dx
  1086. (*%T LongAddr *)
  1087.     push ds
  1088.   (*%T RegParam *)
  1089.     mov  ds, cx
  1090.   (*%E *)
  1091.   (*%F RegParam *)
  1092.     lds  si, [bp][ActNamOfs]
  1093.   (*%E *)
  1094. (*%E *)
  1095. (*%T RegParam *)
  1096.     RetSize = 0
  1097.     mov  cl, al
  1098.     xor  ch, ch
  1099.     mov  si, bx
  1100. (*%E *)
  1101. (*%F RegParam *)
  1102.   (*%F LongAddr *)
  1103.     mov  si, [bp][ActNamOfs]
  1104.   (*%E *)
  1105.     mov  cx, [bp][ActLen]
  1106. (*%E *)
  1107.     call near FioAsm$ToPath
  1108.     int  21H
  1109.     call near FioAsm$SetIorBool 
  1110. (*%T LongAddr *)
  1111.     pop ds
  1112. (*%E *)
  1113.     pop dx
  1114.     pop si
  1115. (*%F RegParam *)
  1116.     pop  bp
  1117. (*%E *)
  1118. (*%F sameCS *)
  1119.     ret  far RetSize
  1120. (*%E *)
  1121. (*%T sameCS *)
  1122.     ret near RetSize
  1123. (*%E *)
  1124.  
  1125. section; segment _TEXT(CODE,28H); segment _BSS(BSS, 28H); group DGROUP(_BSS)
  1126. select _TEXT
  1127.  
  1128. extrn FioAsm@IOR
  1129.  
  1130. public FioAsm$Seek : 
  1131. (*%T RegParam *)
  1132.     (* AX=handle; CX=SeekHi; BX=SeekLo *) 
  1133.   (*%F LongAddr *) (*SeekOKOfs = DX *) 
  1134.     RetSize = 0              (* calling procedure pops *)
  1135.   (*%E *)
  1136.   (*%T LongAddr *)
  1137.     SeekOKSeg = frame+4; SeekOKOfs = frame+2
  1138.     RetSize = 4
  1139.     push bp; mov bp,sp
  1140.     push dx
  1141.   (*%E *)
  1142. (*%E *)
  1143. (*%F RegParam *)
  1144.   (*%T LongAddr *)
  1145.     SeekFile = frame+10; SeekHi = frame+8; SeekLo = frame+6; 
  1146.     SeekOKSeg = frame+4; SeekOKOfs = frame+2
  1147.     RetSize = 10
  1148.   (*%E *)
  1149.   (*%F LongAddr *)
  1150.     SeekFile = frame+8; SeekHi = frame+6; SeekLo = frame+4; SeekOKOfs = frame+2
  1151.     RetSize = 8
  1152.   (*%E *)
  1153.     push bp; mov bp,sp
  1154.     push dx
  1155. (*%E *)
  1156.     push di; 
  1157. (*%T LongAddr *)
  1158.     push ds
  1159.     lds  di, [bp][SeekOKOfs]
  1160. (*%E *)
  1161. (*%F LongAddr *)
  1162.   (*%F RegParam *)
  1163.     mov  di, [bp][SeekOKOfs]
  1164.   (*%E *)
  1165.   (*%T RegParam *)
  1166.     mov  di, dx
  1167.   (*%E *)
  1168. (*%E *)
  1169. (*%F RegParam *)
  1170.     mov  dx, [bp][SeekLo]
  1171.     mov  cx, [bp][SeekHi]
  1172.     mov  bx, [bp][SeekFile]
  1173. (*%E *)
  1174. (*%T RegParam *)
  1175.     mov  dx, bx         (* cx already = seek high *)
  1176.     mov  bx, ax
  1177. (*%E *)
  1178.     mov  ax, 4200H      (* seek absolute *)
  1179.     int  21H
  1180.     jnc  SeekGood
  1181.     mov  cs:[FioAsm@IOR],ax   (* error is in ax *)
  1182.     mov  byte [di],0    (* OK false *)
  1183.     jmp  SeekRet
  1184. SeekGood:
  1185.     mov  byte [di],1
  1186. SeekRet:
  1187. (*%T LongAddr *)
  1188.     pop ds
  1189. (*%E *)
  1190.     pop di
  1191. (*%T RegParam *)
  1192.   (*%T LongAddr *)
  1193.     pop  dx
  1194.     pop  bp
  1195.   (*%E *)
  1196. (*%E *)
  1197. (*%F RegParam *)
  1198.     pop  dx
  1199.     pop  bp
  1200. (*%E *)
  1201. (*%F sameCS *)
  1202.     ret  far RetSize
  1203. (*%E *)
  1204. (*%T sameCS *)
  1205.     ret near RetSize
  1206. (*%E *)
  1207.  
  1208. section; segment _TEXT(CODE,28H); segment _BSS(BSS, 28H); group DGROUP(_BSS)
  1209. select _TEXT
  1210.  
  1211. extrn FioAsm@IOR
  1212.  
  1213. public FioAsm$SeekRel : 
  1214. (*%T RegParam *)
  1215.     (* AX=handle; CX=SeekHi; BX=SeekLo *) 
  1216.   (*%F LongAddr *) (* SeekOKOfs = DX *) 
  1217.     RetSize = 0              (* calling procedure pops *)
  1218.   (*%E *)
  1219.   (*%T LongAddr *)
  1220.     SeekOKSeg = frame+4; SeekOKOfs = frame+2
  1221.     RetSize = 4
  1222.     push bp; mov bp,sp
  1223.     push dx
  1224.   (*%E *)
  1225. (*%E *)
  1226. (*%F RegParam *)
  1227.   (*%T LongAddr *)
  1228.     SeekFile = frame+10; SeekHi = frame+8; SeekLo = frame+6; 
  1229.     SeekOKSeg = frame+4; SeekOKOfs = frame+2
  1230.     RetSize = 10
  1231.   (*%E *)
  1232.   (*%F LongAddr *)
  1233.     SeekFile = frame+8; SeekHi = frame+6; SeekLo = frame+4; SeekOKOfs = frame+2
  1234.     RetSize = 8
  1235.   (*%E *)
  1236.     push bp; mov bp,sp
  1237.     push dx
  1238. (*%E *)
  1239.     push di; 
  1240. (*%T LongAddr *)
  1241.     push ds
  1242.     lds  di, [bp][SeekOKOfs]
  1243. (*%E *)
  1244. (*%F LongAddr *)
  1245.   (*%F RegParam *)
  1246.     mov  di, [bp][SeekOKOfs]
  1247.   (*%E *)
  1248.   (*%T RegParam *)
  1249.     mov  di, dx
  1250.   (*%E *)
  1251. (*%E *)
  1252. (*%F RegParam *)
  1253.     mov  dx, [bp][SeekLo]
  1254.     mov  cx, [bp][SeekHi]
  1255.     mov  bx, [bp][SeekFile]
  1256. (*%E *)
  1257. (*%T RegParam *)
  1258.     mov  dx, bx         (* cx already = seek high *)
  1259.     mov  bx, ax
  1260. (*%E *)
  1261.     mov  ax, 4201H      (* seek relative *)
  1262.     int  21H
  1263.     jnc  SeekRelGood
  1264.     mov  cs:[FioAsm@IOR],ax   (* error is in ax *)
  1265.     mov  byte [di],0    (* OK false *)
  1266.     jmp  SeekRelRet
  1267. SeekRelGood:
  1268.     mov  byte [di],1
  1269. SeekRelRet:
  1270. (*%T LongAddr *)
  1271.     pop ds
  1272. (*%E *)
  1273.     pop di
  1274. (*%T RegParam *)
  1275.   (*%T LongAddr *)
  1276.     pop  dx
  1277.     pop  bp
  1278.   (*%E *)
  1279. (*%E *)
  1280. (*%F RegParam *)
  1281.     pop  dx
  1282.     pop  bp
  1283. (*%E *)
  1284. (*%F sameCS *)
  1285.     ret  far RetSize
  1286. (*%E *)
  1287. (*%T sameCS *)
  1288.     ret near RetSize
  1289. (*%E *)
  1290.  
  1291. section; segment _TEXT(CODE,28H); segment _BSS(BSS, 28H); group DGROUP(_BSS)
  1292. select _TEXT
  1293.  
  1294. extrn FioAsm@IOR
  1295.  
  1296. public FioAsm$GetPos : 
  1297. (*%T RegParam *)
  1298.     RetSize = 0 (*AX=handle; BX=Ofs; CX=Seg *)
  1299. (*%E *)
  1300. (*%F RegParam *)
  1301.   (*%T LongAddr *)
  1302.     GetFile = frame + 6; GetOKSeg = frame + 4; GetOKOfs = frame + 2
  1303.     RetSize = 6
  1304.   (*%E *)
  1305.   (*%F LongAddr *)
  1306.     GetFile = frame + 4; GetOKOfs = frame + 2
  1307.     RetSize = 4
  1308.   (*%E *)
  1309.     push bp; mov bp,sp
  1310. (*%E *)
  1311.     push di; 
  1312. (*%T LongAddr *)
  1313.     push ds
  1314.   (*%T RegParam *)
  1315.     mov  ds, cx
  1316.   (*%E *)
  1317.   (*%F RegParam *)
  1318.     lds  di, [bp][GetOKOfs]
  1319.   (*%E *)
  1320. (*%E *)
  1321. (*%F LongAddr *)
  1322.   (*%F RegParam *)
  1323.     mov  di, [bp][GetOKOfs]
  1324.   (*%E *)
  1325. (*%E *)
  1326. (*%T RegParam *)
  1327.     mov  di, bx
  1328.     mov  bx,ax
  1329. (*%E *)
  1330. (*%F RegParam *)
  1331.     mov  bx, [bp][GetFile]
  1332. (*%E *)
  1333.     xor  dx,dx          (* no offset *)
  1334.     xor  cx,cx
  1335.     mov  ax, 4201H      (* seek relative *)
  1336.     int  21H
  1337.     jnc  GetGood
  1338.     mov  cs:[FioAsm@IOR],ax   (* error is in ax *)
  1339.     mov  byte [di],0 (* OK false *)
  1340.     jmp  GetRet
  1341. GetGood:
  1342.     mov  byte [di],1
  1343. GetRet:
  1344. (*%T LongAddr *)
  1345.     pop ds
  1346. (*%E *)
  1347.     pop di
  1348. (*%F RegParam *)
  1349.     pop  bp
  1350. (*%E *)
  1351. (*%F sameCS *)
  1352.     ret  far RetSize
  1353. (*%E *)
  1354. (*%T sameCS *)
  1355.     ret near RetSize
  1356. (*%E *)
  1357.  
  1358. section; segment _TEXT(CODE,28H); segment _BSS(BSS, 28H); group DGROUP(_BSS)
  1359. select _TEXT
  1360.  
  1361. extrn FioAsm@IOR
  1362.  
  1363. public FioAsm$SeekEOF :
  1364. (*%T RegParam *)
  1365.     RetSize = 0 (*AX=handle; BX=Ofs; CX=Seg *)
  1366. (*%E *)
  1367. (*%F RegParam *)
  1368.   (*%T LongAddr *)
  1369.     SEOFFile = frame + 6; SEOFOKSeg = frame + 4; SEOFOKOfs = frame + 2
  1370.     RetSize = 6
  1371.   (*%E *)
  1372.   (*%F LongAddr *)
  1373.     SEOFFile = frame + 4; SEOFOKOfs = frame + 2
  1374.     RetSize = 4
  1375.   (*%E *)
  1376.     push bp; mov bp,sp
  1377. (*%E *)
  1378.     push di; 
  1379.     push dx
  1380. (*%T LongAddr *)
  1381.     push ds
  1382.   (*%T RegParam *)
  1383.     mov  ds, cx
  1384.   (*%E *)
  1385.   (*%F RegParam *)
  1386.     lds  di, [bp][SEOFOKOfs]
  1387.   (*%E *)
  1388. (*%E *)
  1389. (*%F LongAddr *)
  1390.   (*%F RegParam *)
  1391.     mov  di, [bp][SEOFOKOfs]
  1392.   (*%E *)
  1393. (*%E *)
  1394. (*%T RegParam *)
  1395.     mov  di, bx
  1396.     mov  bx,ax
  1397. (*%E *)
  1398. (*%F RegParam *)
  1399.     mov  bx, [bp][SEOFFile]
  1400. (*%E *)
  1401.     xor  dx,dx          (* no offset *)
  1402.     xor  cx,cx
  1403.     mov  ax, 4202H      (* seek EOF *)
  1404.     int  21H
  1405.     jnc  SEOFGood
  1406.     mov  cs:[FioAsm@IOR],ax   (* error is in ax *)
  1407.     mov  byte [di],0 (* OK false *)
  1408.     jmp  SEOFRet
  1409. SEOFGood:
  1410.     mov  byte [di],1
  1411. SEOFRet:
  1412. (*%T LongAddr *)
  1413.     pop ds
  1414. (*%E *)
  1415.     pop dx
  1416.     pop di
  1417. (*%F RegParam *)
  1418.     pop  bp
  1419. (*%E *)
  1420. (*%F sameCS *)
  1421.     ret  far RetSize
  1422. (*%E *)
  1423. (*%T sameCS *)
  1424.     ret near RetSize
  1425. (*%E *)
  1426.  
  1427. section; segment _TEXT(CODE,28H); segment _BSS(BSS, 28H); group DGROUP(_BSS)
  1428. select _TEXT
  1429.  
  1430. extrn FioAsm@IOR
  1431.  
  1432. public FioAsm$EOF : (*AX=handle; BX=Ofs; CX=Seg *)
  1433. (*%T RegParam *)
  1434.     RetSize = 0 (*AX=handle; BX=Ofs; CX=Seg *)
  1435. (*%E *)
  1436. (*%F RegParam *)
  1437.   (*%T LongAddr *)
  1438.     EofFile = frame + 6; EofOKSeg = frame + 4; EofOKOfs = frame + 2
  1439.     RetSize = 6
  1440.   (*%E *)
  1441.   (*%F LongAddr *)
  1442.     EofFile = frame + 4; EofOKOfs = frame + 2
  1443.     RetSize = 4
  1444.   (*%E *)
  1445.     push bp; mov bp,sp
  1446. (*%E *)
  1447.     push di; 
  1448.     push dx
  1449. (*%T LongAddr *)
  1450.     push ds
  1451.   (*%T RegParam *)
  1452.     mov  ds, cx
  1453.   (*%E *)
  1454.   (*%F RegParam *)
  1455.     lds  di, [bp][EofOKOfs]
  1456.   (*%E *)
  1457. (*%E *)
  1458. (*%F LongAddr *)
  1459.   (*%F RegParam *)
  1460.     mov  di, [bp][EofOKOfs]
  1461.   (*%E *)
  1462. (*%E *)
  1463. (*%T RegParam *)
  1464.     mov  di, bx
  1465.     mov  bx,ax
  1466. (*%E *)
  1467. (*%F RegParam *)
  1468.     mov  bx, [bp][EofFile]
  1469. (*%E *)
  1470.     mov  ax, 4406H      (* device status, input *)
  1471.     int  21H
  1472.     jnc  EOFgood
  1473.     mov  cs:[FioAsm@IOR],ax   (* error is in ax *)
  1474.     mov  ax,1      (* set TRUE, just in case *)
  1475.     mov  byte ds:[di],0 (* OK false *)
  1476.     jmp  EofRet
  1477. EOFgood:
  1478.     not  al        (* reverse TRUE, FALSE *)
  1479.     and  ax,1      (* reset all but last bit *)
  1480.     mov  byte ds:[di],1  (* OK true *)
  1481. EofRet:
  1482. (*%T LongAddr *)
  1483.     pop ds
  1484. (*%E *)
  1485.     pop dx
  1486.     pop di
  1487. (*%F RegParam *)
  1488.     pop  bp
  1489. (*%E *)
  1490. (*%F sameCS *)
  1491.     ret  far RetSize
  1492. (*%E *)
  1493. (*%T sameCS *)
  1494.     ret near RetSize
  1495. (*%E *)
  1496.  
  1497. section; segment _TEXT(CODE,28H); select _TEXT
  1498.  
  1499. extrn FioAsm$ToPath
  1500.  
  1501. public FioAsm$ReadFirstEntry : 
  1502. (*%T RegParam *)
  1503.   (*%T LongAddr *)
  1504.     (* AX=R1Len; BX=R1Ofs; CX=R1Seg; DX= R1Attr *)
  1505.     D1Seg = frame+4; D1Ofs = frame+2;
  1506.     RetSize = 4              (* calling procedure pops *)
  1507.     push bp; mov bp,sp
  1508.     push dx
  1509.   (*%E *)
  1510.   (*%F LongAddr *) (*AX=R1Len; BX=R1Ofs; CX= R1Attr DX= D1Ofs *)
  1511.     RetSize = 0              (* calling procedure pops *)
  1512.   (*%E *)
  1513. (*%E *)
  1514. (*%F RegParam *)
  1515.   (*%T LongAddr *)
  1516.     R1Len = frame+12; R1Seg = frame+10; R1Ofs = frame+8
  1517.     R1Attr = frame+6; D1Seg = frame+4; D1Ofs = frame+2;
  1518.     RetSize = 12
  1519.   (*%E *)
  1520.   (*%F LongAddr *)
  1521.     R1Len = frame+8; R1Ofs = frame+6; R1Attr = frame+4; D1Ofs = frame+2;
  1522.     RetSize = 8
  1523.   (*%E *)
  1524.     push bp; mov bp,sp
  1525.     push dx
  1526. (*%E *)
  1527. (*%T LongAddr *)
  1528.     push ds; 
  1529. (*%E *)
  1530.     push di; push si
  1531. (*%T RegParam *)
  1532.   (*%T LongAddr *)
  1533.     push dx                       (* save attrib *)
  1534.   (*%E *)
  1535.   (*%F LongAddr *)
  1536.     push cx                       (* save attrib *)
  1537.   (*%E *)
  1538. (*%E *)
  1539. (*%T LongAddr *)
  1540.     lds  dx, [bp][D1Ofs]
  1541. (*%E *)
  1542. (*%F LongAddr *)
  1543.   (*%F RegParam *)
  1544.     mov  dx, [bp][D1Ofs]
  1545.   (*%E *)
  1546. (*%E *)
  1547.     mov  ah, 1AH             (* set DTA to D *)
  1548.     int  21H
  1549. (*%T RegParam *)
  1550.    (*%T LongAddr *)
  1551.     mov  ds, cx
  1552.   (*%E *)
  1553.     mov  si,bx
  1554.     mov  cl,al               (* get buffer length *)
  1555.     xor  ch,ch               (* with no trash in upper register *)
  1556. (*%E *)
  1557. (*%F RegParam *)
  1558.   (*%T LongAddr *)
  1559.     lds  si,[bp][R1Ofs]
  1560.   (*%E *)
  1561.   (*%F LongAddr *)
  1562.     mov  si,[bp][R1Ofs]
  1563.   (*%E *)
  1564.     mov  cx,[bp][R1Len]      (* get buffer length *)
  1565. (*%E *)
  1566.     call near FioAsm$ToPath
  1567.     mov  ah, 4EH             (* read first *)
  1568. (*%T RegParam *)
  1569.     pop  cx                  (* bet attribute *)
  1570. (*%E *)
  1571. (*%F RegParam *)
  1572.     mov  cx, [bp][R1Attr]
  1573. (*%E *)
  1574.     int  21H
  1575.     jnc  R1OK
  1576.     xor  ax,ax               (* false *)
  1577.     jmp  R1Ret
  1578. R1OK:
  1579.     mov  ax, 1
  1580. R1Ret:
  1581.     pop si; pop di
  1582. (*%T LongAddr *)
  1583.     pop  ds; 
  1584. (*%E *)
  1585. (*%T RegParam *)
  1586.   (*%T LongAddr *)
  1587.     pop dx
  1588.     pop bp
  1589.   (*%E *)
  1590. (*%E *)
  1591. (*%F RegParam *)
  1592.     pop dx
  1593.     pop bp
  1594. (*%E *)
  1595. (*%F sameCS *)
  1596.     ret  far RetSize
  1597. (*%E *)
  1598. (*%T sameCS *)
  1599.     ret near RetSize
  1600. (*%E *)
  1601.  
  1602. section; segment _TEXT(CODE,28H); select _TEXT
  1603.  
  1604. public FioAsm$ReadNextEntry : 
  1605. (*%T RegParam *)
  1606.     RetSize = 0 (* BX=Seg; AX=Ofs *)
  1607. (*%E *)
  1608. (*%F RegParam *)
  1609.     D2Seg = frame+4; D2Ofs = frame+2
  1610.   (*%T LongAddr *)
  1611.     RetSize = 4
  1612.   (*%E *)
  1613.   (*%F LongAddr *)
  1614.     RetSize = 2
  1615.   (*%E *)
  1616.     push bp; mov bp,sp
  1617. (*%E *)
  1618.     push dx
  1619. (*%T LongAddr *)
  1620.     push ds
  1621.   (*%T RegParam *)
  1622.     mov  ds, bx
  1623.   (*%E *)
  1624.   (*%F RegParam *)
  1625.     lds  dx, [bp][D2Ofs]
  1626.   (*%E *)
  1627. (*%E *)
  1628. (*%F LongAddr *)
  1629.   (*%F RegParam *)
  1630.     mov  dx, [bp][D2Ofs]
  1631.   (*%E *)
  1632. (*%E *)
  1633. (*%T RegParam *)
  1634.     mov  dx, ax
  1635. (*%E *)
  1636.     mov  ah, 1AH             (* set DTA to D *)
  1637.     int  21H
  1638.     mov  ah, 4FH             (* read next *)
  1639.     int  21H                 
  1640.     jnc  R2OK
  1641.     xor  ax,ax               (* false *)
  1642.     jmp  R2Ret
  1643. R2OK:
  1644.     mov  ax, 1
  1645. R2Ret:
  1646. (*%T LongAddr *)
  1647.     pop  ds; 
  1648. (*%E *)
  1649.     pop dx
  1650. (*%F RegParam *)
  1651.     pop bp
  1652. (*%E *)
  1653. (*%F sameCS *)
  1654.     ret  far RetSize
  1655. (*%E *)
  1656. (*%T sameCS *)
  1657.     ret near RetSize
  1658. (*%E *)
  1659.  
  1660. section; segment _TEXT(CODE,28H); select _TEXT
  1661.  
  1662. public FioAsm$SetDTA: 
  1663. (*%T RegParam *)
  1664.     RetSize = 0 (*BX=Seg; AX=Ofs *)
  1665. (*%E *)
  1666. (*%F RegParam *)
  1667.     DTASeg = frame+4; DTAOfs = frame+2
  1668.   (*%T LongAddr *)
  1669.     RetSize = 4
  1670.   (*%E *)
  1671.   (*%F LongAddr *)
  1672.     RetSize = 2
  1673.   (*%E *)
  1674.     push bp; mov bp,sp
  1675. (*%E *)
  1676.     push dx
  1677. (*%T LongAddr *)
  1678.     push ds
  1679.   (*%T RegParam *)
  1680.     mov  ds, bx
  1681.   (*%E *)
  1682.   (*%F RegParam *)
  1683.     lds  dx, [bp][DTAOfs]
  1684.   (*%E *)
  1685. (*%E *)
  1686. (*%F LongAddr *)
  1687.   (*%F RegParam *)
  1688.     mov  dx, [bp][DTAOfs]
  1689.   (*%E *)
  1690. (*%E *)
  1691. (*%T RegParam *)
  1692.     mov  dx, ax
  1693. (*%E *)
  1694.     mov  ah, 1AH             (* set DTA to D *)
  1695.     int  21H
  1696. (*%T LongAddr *)
  1697.     pop  ds
  1698. (*%E *)
  1699.     pop dx
  1700. (*%F RegParam *)
  1701.     pop bp
  1702. (*%E *)
  1703. (*%F sameCS *)
  1704.     ret  far RetSize
  1705. (*%E *)
  1706. (*%T sameCS *)
  1707.     ret near RetSize
  1708. (*%E *)
  1709.  
  1710. section; segment _TEXT(CODE,28H); select _TEXT
  1711.  
  1712. (* NO ARGUMENTS *)
  1713. public FioAsm$GetDTA:
  1714. (*%T LongAddr *)
  1715.     push ds; 
  1716. (*%E *)
  1717.     push bx
  1718.     mov  ah, 2FH
  1719.     int  21H
  1720. (*%T LongAddr *)
  1721.     mov  dx,es
  1722. (*%E *)
  1723.     mov  ax, bx
  1724.     pop  bx
  1725. (*%T LongAddr *)
  1726.     pop  ds
  1727. (*%E *)
  1728. (*%F sameCS *)
  1729.     ret  far 0
  1730. (*%E *)
  1731. (*%T sameCS *)
  1732.     ret near 0
  1733. (*%E *)
  1734.  
  1735. section; segment _TEXT(CODE,28H); select _TEXT
  1736.  
  1737. public FioAsm$DiskFree: 
  1738. (*%T RegParam *)
  1739.     RetSize = 0    (* AX=dr; CX=seg; BX=ofs *)
  1740. (*%E *)
  1741. (*%F RegParam *)
  1742.   (*%T LongAddr *)
  1743.     dr = frame+6; BPCseg = frame+4; BPCofs = frame+2
  1744.     RetSize = 6
  1745.   (*%E *)
  1746.   (*%F LongAddr *)
  1747.     dr = frame+4; BPCofs = frame+2
  1748.     RetSize = 4
  1749.   (*%E *)
  1750.     push bp; mov bp,sp
  1751. (*%E *)
  1752.     push si;
  1753. (*%T LongAddr *)
  1754.     push ds
  1755.   (*%T RegParam *)
  1756.     mov  ds, cx
  1757.   (*%E *)
  1758.   (*%F RegParam *)
  1759.     lds  si,[bp][BPCofs]
  1760.   (*%E *)
  1761. (*%E *)
  1762. (*%F RegParam *)
  1763.   (*%F LongAddr *)
  1764.     mov  si,[bp][BPCofs]
  1765.   (*%E *)
  1766.     mov  dl, [bp][dr]   (* load drive *)
  1767. (*%E *)
  1768. (*%T RegParam *)
  1769.     mov  si,bx
  1770.     mov  dl, ax         (* drive *)
  1771. (*%E *)
  1772.     mov  ah, 36H        (* get disk data *)
  1773.     int  21H
  1774.     cmp  ax, 0FFFFH
  1775.     jne  OKdr
  1776.     xor  ax, ax
  1777. OKdr:
  1778.     mul  cx
  1779.     mov  [si],ax
  1780.     mul  bx
  1781. (*%T LongAddr *)
  1782.     pop ds
  1783. (*%E *)
  1784.     pop si 
  1785. (*%F RegParam *)
  1786.     pop bp
  1787. (*%E *)
  1788. (*%F sameCS *)
  1789.     ret  far RetSize
  1790. (*%E *)
  1791. (*%T sameCS *)
  1792.     ret near RetSize
  1793. (*%E *)
  1794.  
  1795. end
  1796.